package org.example.springboot.controller;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import jakarta.annotation.Resource;
import org.example.springboot.common.Result;
import org.example.springboot.entity.Account;
import org.example.springboot.entity.Employee;
import org.example.springboot.exception.CustomException;
import org.example.springboot.service.AdminService;
import org.example.springboot.service.ArticleService;
import org.example.springboot.service.EmployeeService;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.stream.Collectors;

@RestController
public class WebController {
    @Resource
    private EmployeeService employeeService;
    @Resource
    private AdminService adminService;
    @Resource
    private ArticleService articleService;
    @GetMapping("/hello")
    public Result hello() {
        return Result.success("Hello World");
    }
    @PostMapping("/login")
    public Result login(@RequestBody Account account) {
        Account result = null;
        if("ADMIN".equals(account.getRole())){
            result = adminService.login(account);
        }else if("EMP".equals(account.getRole())){
            result = employeeService.login(account);
        }else{
            throw new CustomException("500","非法输入");
        }
        return Result.success(result);
    }

    @PostMapping("/register")
    public Result Register(@RequestBody Employee employee) {
       employeeService.register(employee);
       return Result.success();
    }

    @PutMapping("/updatePassword")
    public Result UpdatePassword(@RequestBody Account account) {
        if("ADMIN".equals(account.getRole())){
            adminService.updatePassword(account);
        }else if("EMP".equals(account.getRole())){
            employeeService.updatePassword(account);
        }else{
            throw new CustomException("500","非法输入");
        }
        return Result.success();
    }


    @GetMapping("/barData")
    public Result getBarData() {
        Map<String, Object> map = new HashMap<>();
        List<Employee> employeeList = employeeService.selectAll(null);
        Set<String> departmentNameSet = employeeList.stream().map(Employee::getDepartmentName).collect(Collectors.toSet());
        map.put("department", departmentNameSet); // 横轴数据
        List<Long> countList = new ArrayList<>();
        for (String departmentName : departmentNameSet) {
            // 统计每个部门的员工数量
            long count = employeeList.stream().filter(employee -> employee.getDepartmentName().equals(departmentName)).count();
            countList.add(count);
        }
        map.put("count", countList); // 纵轴数据
        return Result.success(map);
    }

      /**
     * 获取用于绘制折线图的数据接口
     *
     * 该方法返回最近7天（包括今天）的日期列表和每天对应的文章数量
     * 前端可以使用这些数据在图表库（如 ECharts）中绘制折线图
     *
     * @return 返回封装了日期和文章数量的 Map 数据结构
     */
    @GetMapping("/lineData")
    public Result getLineData() {
        // 创建一个 Map 用于存储最终返回给前端的数据
        Map<String, Object> map = new HashMap<>();

        // 创建一个 List 用于存储每天的文章数量
        List<Integer> countList = new ArrayList<>();

        // 获取当前时间
        Date date = new Date();

        // 使用 Hutool 计算出从今天往前推7天的时间点
        DateTime nowTime = DateUtil.offsetDay(date, -7);

        // 生成从 nowTime 到 date 的每一天的 DateTime 列表（共8天：含头尾）
        List<DateTime> dateTimeList = DateUtil.rangeToList(nowTime, date, DateField.DAY_OF_YEAR);

        // 将 DateTime 列表格式化为字符串列表（格式为 "MM月dd日"），用于前端显示
        List<String> dateStrList = dateTimeList.stream()
                .map(dateTime -> DateUtil.format(dateTime, "MM月dd日"))
                .collect(Collectors.toList());

        // 将格式化后的日期字符串列表放入 map 中，key 为 "date"
        map.put("date", dateStrList);

        // 遍历每个日期，查询当天的文章数量并存入 countList
        for (DateTime day : dateTimeList) {
            // 格式化日期为 "yyyy-MM-dd"，便于数据库查询
            String dateStr = DateUtil.format(day, "yyyy-MM-dd");

            // 调用 ArticleService 查询该日期的文章数量
            Integer count = articleService.selectCountByDate(dateStr);

            // 将数量加入列表
            countList.add(count);
        }

        // 将文章数量列表放入 map，key 为 "count"
        map.put("count", countList);

        // 返回统一格式的响应结果，data 字段即为这个 map
        return Result.success(map);
    }


     /**
     * 获取用于绘制饼图的数据接口
     *
     * 该方法返回每个部门及其对应的员工数量，前端可以使用这些数据在图表库（如 ECharts）中绘制饼图
     *
     * @return 返回封装了部门名称和人数的 List<Map<String, Object>> 数据结构
     */
    @GetMapping("/pieData")
    public Result getPieData() {
        // 创建一个 List，用于存储多个 Map 对象，每个 Map 表示一个部门及其人数
        List<Map<String, Object>> list = new ArrayList<>();

        // 从数据库中查询所有员工信息
        List<Employee> employeeList = employeeService.selectAll(null);

        // 使用 Stream 提取所有不重复的部门名称（Set 集合自动去重）
        Set<String> departmentNameSet = employeeList.stream()
                .map(Employee::getDepartmentName)
                .collect(Collectors.toSet());

        // 遍历每一个部门名称
        for (String departmentName : departmentNameSet) {
            // 创建一个 Map，用于保存单个部门的名称和人数
            Map<String, Object> map = new HashMap<>();

            // 将部门名称放入 map，键为 "name"
            map.put("name", departmentName);

            // 统计该部门的员工数量：使用 filter + count 实现筛选和计数
            long count = employeeList.stream()
                    .filter(employee -> employee.getDepartmentName().equals(departmentName))
                    .count();

            // 将部门人数放入 map，键为 "value"
            map.put("value", count);

            // 将当前部门的信息添加到最终结果列表中
            list.add(map);
        }

        // 返回统一格式的响应结果，data 字段即为这个 list
        return Result.success(list);
    }


}
